package com.jingdianjichi.auth.application.config;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.List;

/**
 * mvc全局处理
 */
@Component
public class GlobalConfig extends WebMvcConfigurationSupport {
    //
    /**
     * 配置消息转换器
     * 该方法用于配置HTTP请求和响应的消息转换器
     * @param converters 消息转换器列表，用于处理HTTP请求和响应的转换
     */
    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters); // 调用父类的配置方法
        converters.add(mappingJackson2HttpMessageConverter()); // 添加Jackson2消息转换器
    }

/**
 * 创建并配置MappingJackson2HttpMessageConverter实例
 * 该方法用于配置Jackson的ObjectMapper，用于处理HTTP请求和响应的JSON序列化与反序列化
 *
 * @return 配置好的MappingJackson2HttpMessageConverter实例
 */
    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    // 创建ObjectMapper实例，它是Jackson库的核心类，用于处理JSON的读写
        ObjectMapper objectMapper=new ObjectMapper();
    // 配置ObjectMapper，当遇到空bean时不抛出异常，而是继续序列化
    // 这样可以避免因某些字段为空而导致整个序列化过程失败
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);
    // 设置序列化时，只包含非null值的字段
    // 这样可以确保JSON输出中不包含null值的属性，使输出更简洁
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    // 创建并返回配置好的MappingJackson2HttpMessageConverter实例
    // 该转换器用于将HTTP请求和响应体与Java对象之间进行JSON格式的转换
        return new MappingJackson2HttpMessageConverter(objectMapper);
    }

}
